🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / core / data / src / commonTest / kotlin / org / meshtastic / core / data / manager / FromRadioPacketHandlerImplTest.kt
Displaying Raw • Download
core/data/src/commonTest/kotlin/org/meshtastic/core/data/manager/FromRadioPacketHandlerImplTest.kt 01cd54907d62cd90913d3d071b6bc240cae365ef (01cd5490) Text, 13.67 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.core.data.manager
Tff7b72import T7ee787dev.mokkery.MockMode
Tff7b72import T7ee787dev.mokkery.answering.calls
Tff7b72import T7ee787dev.mokkery.answering.returns
Tff7b72import T7ee787dev.mokkery.every
Tff7b72import T7ee787dev.mokkery.everySuspend
Tff7b72import T7ee787dev.mokkery.matcher.any
Tff7b72import T7ee787dev.mokkery.mock
Tff7b72import T7ee787dev.mokkery.verify
Tff7b72import T7ee787dev.mokkery.verify.VerifyMode
Tff7b72import T7ee787dev.mokkery.verifySuspend
Tff7b72import T7ee787org.meshtastic.core.model.util.isOtaStatusNotification
Tff7b72import T7ee787org.meshtastic.core.repository.FirmwareUpdateStatusRepository
Tff7b72import T7ee787org.meshtastic.core.repository.MeshConfigFlowManager
Tff7b72import T7ee787org.meshtastic.core.repository.MeshConfigHandler
Tff7b72import T7ee787org.meshtastic.core.repository.MqttManager
Tff7b72import T7ee787org.meshtastic.core.repository.NotificationManager
Tff7b72import T7ee787org.meshtastic.core.repository.PacketHandler
Tff7b72import T7ee787org.meshtastic.core.repository.RadioInterfaceService
Tff7b72import T7ee787org.meshtastic.core.repository.RadioSessionContext
Tff7b72import T7ee787org.meshtastic.core.repository.RadioSessionLease
Tff7b72import T7ee787org.meshtastic.core.repository.ServiceRepository
Tff7b72import T7ee787org.meshtastic.core.repository.XModemManager
Tff7b72import T7ee787org.meshtastic.core.testing.FakeLockdownCoordinator
Tff7b72import T7ee787org.meshtastic.proto.Channel
Tff7b72import T7ee787org.meshtastic.proto.ClientNotification
Tff7b72import T7ee787org.meshtastic.proto.Config
Tff7b72import T7ee787org.meshtastic.proto.DeviceMetadata
Tff7b72import T7ee787org.meshtastic.proto.FromRadio
Tff7b72import T7ee787org.meshtastic.proto.LoRaRegionPresetMap
Tff7b72import T7ee787org.meshtastic.proto.LockdownStatus
Tff7b72import T7ee787org.meshtastic.proto.ModuleConfig
Tff7b72import T7ee787org.meshtastic.proto.MqttClientProxyMessage
Tff7b72import T7ee787org.meshtastic.proto.MyNodeInfo
Tff7b72import T7ee787org.meshtastic.proto.QueueStatus
Tff7b72import T7ee787org.meshtastic.proto.XModem
Tff7b72import T7ee787kotlin.test.BeforeTest
Tff7b72import T7ee787kotlin.test.Test
Tff7b72import T7ee787kotlin.test.assertEquals
Tff7b72import T7ee787kotlin.test.assertFalse
Tff7b72import T7ee787kotlin.test.assertTrue
Tff7b72import T7ee787org.meshtastic.proto.NodeInfo Tff7b72as Te6edf3ProtoNodeInfo
Tff7b72class T56d364FromRadioPacketHandlerImplTest Tb4b4b4{
Tff7b72private Tff7b72val Te6edf3serviceRepositoryTb4b4b4: Te6edf3ServiceRepository Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3mqttManagerTb4b4b4: Te6edf3MqttManager Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3packetHandlerTb4b4b4: Te6edf3PacketHandler Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3notificationManagerTb4b4b4: Te6edf3NotificationManager Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3configFlowManagerTb4b4b4: Te6edf3MeshConfigFlowManager Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3configHandlerTb4b4b4: Te6edf3MeshConfigHandler Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3xmodemManagerTb4b4b4: Te6edf3XModemManager Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3lockdownCoordinator Tff7b72= Te6edf3FakeLockdownCoordinatorTb4b4b4(Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3firmwareUpdateStatusRepository Tff7b72= Te6edf3FirmwareUpdateStatusRepositoryTb4b4b4(Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3radioInterfaceServiceTb4b4b4: Te6edf3RadioInterfaceService Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3session Tff7b72= Te6edf3RadioSessionContextTb4b4b4(Te6edf3generation Tff7b72= T79c0ff7LTb4b4b4, Te6edf3address Tff7b72= Ta5d6ff"Ta5d6fftcp:testTa5d6ff"Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3sessionLease Tff7b72=
Tff7b72object Tb4b4b4: T56d364RadioSessionLease Tb4b4b4{
Tff7b72override Tff7b72val Te6edf3sessionTb4b4b4: Te6edf3RadioSessionContext Tff7b72= Tff7b72thisTf0883e@FromRadioPacketHandlerImplTest.session
Tff7b72override Tff7b72fun Td2a8ffisCurrentTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657Boolean Tff7b72= Tff7b72true
Tb4b4b4}
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3handlerTb4b4b4: Te6edf3FromRadioPacketHandlerImpl
Tf0883e@BeforeTest
Tff7b72fun Td2a8ffsetupTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3runIfSessionActiveTb4b4b4(Te6edf3sessionTb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffUNCHECKED_CASTTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3block Tff7b72= Tffa657itTb4b4b4.Te6edf3argsTff7b72[T79c0ff1Tff7b72] Tff7b72as Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657Unit
Te6edf3blockTb4b4b4(Tb4b4b4)
Tff7b72true
Tb4b4b4}
Te6edf3everySuspend Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3runWithSessionLeaseTb4b4b4(Te6edf3sessionTb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffUNCHECKED_CASTTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3block Tff7b72= Tffa657itTb4b4b4.Te6edf3argsTff7b72[T79c0ff1Tff7b72] Tff7b72as Te6edf3suspend Tb4b4b4(Te6edf3RadioSessionLeaseTb4b4b4) Tff7b72-Tff7b72> Tffa657Unit
Te6edf3blockTb4b4b4(Te6edf3sessionLeaseTb4b4b4)
Tff7b72true
Tb4b4b4}
Te6edf3every Tb4b4b4{ Te6edf3configFlowManagerTb4b4b4.Te6edf3handleNodeInfoTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Te6edf3every Tb4b4b4{ Te6edf3configFlowManagerTb4b4b4.Te6edf3handleConfigCompleteTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Te6edf3handler Tff7b72=
Te6edf3FromRadioPacketHandlerImplTb4b4b4(
Te6edf3serviceRepositoryTb4b4b4,
Te6edf3lazy Tb4b4b4{ Te6edf3configFlowManager Tb4b4b4}Tb4b4b4,
Te6edf3lazy Tb4b4b4{ Te6edf3configHandler Tb4b4b4}Tb4b4b4,
Te6edf3lazy Tb4b4b4{ Te6edf3xmodemManager Tb4b4b4}Tb4b4b4,
Te6edf3mqttManagerTb4b4b4,
Te6edf3packetHandlerTb4b4b4,
Te6edf3notificationManagerTb4b4b4,
Te6edf3lockdownCoordinatorTb4b4b4,
Te6edf3firmwareUpdateStatusRepositoryTb4b4b4,
Te6edf3radioInterfaceServiceTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffhandleTb4b4b4(Te6edf3protoTb4b4b4: Te6edf3FromRadioTb4b4b4) Tff7b72= Te6edf3handlerTb4b4b4.Te6edf3handleFromRadioTb4b4b4(Te6edf3protoTb4b4b4, Te6edf3sessionTb4b4b4)
Tf0883e@Test
Tff7b72fun Td2a8ff`handleFromRadio routes MY_INFO to configFlowManager`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3myInfo Tff7b72= Te6edf3MyNodeInfoTb4b4b4(Te6edf3my_node_num Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4)
Tff7b72val Te6edf3proto Tff7b72= Te6edf3FromRadioTb4b4b4(Te6edf3my_info Tff7b72= Te6edf3myInfoTb4b4b4)
Te6edf3handleTb4b4b4(Te6edf3protoTb4b4b4)
Te6edf3verify Tb4b4b4{ Te6edf3configFlowManagerTb4b4b4.Te6edf3handleMyInfoTb4b4b4(Te6edf3myInfoTb4b4b4, Te6edf3sessionTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`handleFromRadio routes METADATA to configFlowManager`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3metadata Tff7b72= Te6edf3DeviceMetadataTb4b4b4(Te6edf3firmware_version Tff7b72= Ta5d6ff"Ta5d6ffv1.0Ta5d6ff"Tb4b4b4)
Tff7b72val Te6edf3proto Tff7b72= Te6edf3FromRadioTb4b4b4(Te6edf3metadata Tff7b72= Te6edf3metadataTb4b4b4)
Te6edf3handleTb4b4b4(Te6edf3protoTb4b4b4)
Te6edf3verify Tb4b4b4{ Te6edf3configFlowManagerTb4b4b4.Te6edf3handleLocalMetadataTb4b4b4(Te6edf3metadataTb4b4b4, Te6edf3sessionTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`handleFromRadio routes NODE_INFO to configFlowManager and updates status`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3nodeInfo Tff7b72= Te6edf3ProtoNodeInfoTb4b4b4(Te6edf3num Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4)
Tff7b72val Te6edf3proto Tff7b72= Te6edf3FromRadioTb4b4b4(Te6edf3node_info Tff7b72= Te6edf3nodeInfoTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3configFlowManagerTb4b4b4.Te6edf3newNodeCount Tb4b4b4} Te6edf3returns T79c0ff1
Te6edf3handleTb4b4b4(Te6edf3protoTb4b4b4)
Te6edf3verify Tb4b4b4{ Te6edf3configFlowManagerTb4b4b4.Te6edf3handleNodeInfoTb4b4b4(Te6edf3nodeInfoTb4b4b4, Te6edf3sessionTb4b4b4) Tb4b4b4}
Te6edf3verify Tb4b4b4{ Te6edf3serviceRepositoryTb4b4b4.Te6edf3setConnectionProgressTb4b4b4(Ta5d6ff"Ta5d6ffNodes (1)Ta5d6ff"Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`handleFromRadio routes CONFIG_COMPLETE_ID to configFlowManager`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3nonce Tff7b72= T79c0ff6T79c0ff9T79c0ff4T79c0ff2T79c0ff0
Tff7b72val Te6edf3proto Tff7b72= Te6edf3FromRadioTb4b4b4(Te6edf3config_complete_id Tff7b72= Te6edf3nonceTb4b4b4)
Te6edf3handleTb4b4b4(Te6edf3protoTb4b4b4)
Te6edf3verify Tb4b4b4{ Te6edf3configFlowManagerTb4b4b4.Te6edf3handleConfigCompleteTb4b4b4(Te6edf3nonceTb4b4b4, Te6edf3sessionTb4b4b4) Tb4b4b4}
Te6edf3assertTrueTb4b4b4(Te6edf3lockdownCoordinatorTb4b4b4.Te6edf3configCompleteCalledTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`stale NODE_INFO does not update connection progress`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3nodeInfo Tff7b72= Te6edf3ProtoNodeInfoTb4b4b4(Te6edf3num Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3configFlowManagerTb4b4b4.Te6edf3handleNodeInfoTb4b4b4(Te6edf3nodeInfoTb4b4b4, Te6edf3sessionTb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72false
Te6edf3handleTb4b4b4(Te6edf3FromRadioTb4b4b4(Te6edf3node_info Tff7b72= Te6edf3nodeInfoTb4b4b4)Tb4b4b4)
Te6edf3verify Tb4b4b4{ Te6edf3configFlowManagerTb4b4b4.Te6edf3handleNodeInfoTb4b4b4(Te6edf3nodeInfoTb4b4b4, Te6edf3sessionTb4b4b4) Tb4b4b4}
Te6edf3verifyTb4b4b4(Te6edf3mode Tff7b72= Te6edf3VerifyModeTb4b4b4.Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3serviceRepositoryTb4b4b4.Te6edf3setConnectionProgressTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`stale CONFIG_COMPLETE does not notify lockdown coordinator`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3nonce Tff7b72= T79c0ff6T79c0ff9T79c0ff4T79c0ff2T79c0ff0
Te6edf3every Tb4b4b4{ Te6edf3configFlowManagerTb4b4b4.Te6edf3handleConfigCompleteTb4b4b4(Te6edf3nonceTb4b4b4, Te6edf3sessionTb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72false
Te6edf3handleTb4b4b4(Te6edf3FromRadioTb4b4b4(Te6edf3config_complete_id Tff7b72= Te6edf3nonceTb4b4b4)Tb4b4b4)
Te6edf3verify Tb4b4b4{ Te6edf3configFlowManagerTb4b4b4.Te6edf3handleConfigCompleteTb4b4b4(Te6edf3nonceTb4b4b4, Te6edf3sessionTb4b4b4) Tb4b4b4}
Te6edf3assertFalseTb4b4b4(Te6edf3lockdownCoordinatorTb4b4b4.Te6edf3configCompleteCalledTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`revoked session skips node progress after handler returns`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3nodeInfo Tff7b72= Te6edf3ProtoNodeInfoTb4b4b4(Te6edf3num Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4Tb4b4b4)
Tff7b72var Te6edf3active Tff7b72= Tff7b72true
Te6edf3every Tb4b4b4{ Te6edf3configFlowManagerTb4b4b4.Te6edf3handleNodeInfoTb4b4b4(Te6edf3nodeInfoTb4b4b4, Te6edf3sessionTb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Te6edf3active Tff7b72= Tff7b72false
Tff7b72true
Tb4b4b4}
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3runIfSessionActiveTb4b4b4(Te6edf3sessionTb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3activeTb4b4b4) Tb4b4b4{
Tff7b72false
Tb4b4b4} Tff7b72else Tb4b4b4{
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffUNCHECKED_CASTTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3block Tff7b72= Tffa657itTb4b4b4.Te6edf3argsTff7b72[T79c0ff1Tff7b72] Tff7b72as Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657Unit
Te6edf3blockTb4b4b4(Tb4b4b4)
Tff7b72true
Tb4b4b4}
Tb4b4b4}
Te6edf3handleTb4b4b4(Te6edf3FromRadioTb4b4b4(Te6edf3node_info Tff7b72= Te6edf3nodeInfoTb4b4b4)Tb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3mode Tff7b72= Te6edf3VerifyModeTb4b4b4.Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3serviceRepositoryTb4b4b4.Te6edf3setConnectionProgressTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`revoked session skips direct packet-dispatch branches`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3runIfSessionActiveTb4b4b4(Te6edf3sessionTb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72false
Tff7b72val Te6edf3proxyMessage Tff7b72= Te6edf3MqttClientProxyMessageTb4b4b4(Te6edf3topic Tff7b72= Ta5d6ff"Ta5d6fftest/topicTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3queueStatus Tff7b72= Te6edf3QueueStatusTb4b4b4(Te6edf3free Tff7b72= T79c0ff1T79c0ff0Tb4b4b4)
Tff7b72val Te6edf3xmodemPacket Tff7b72= Te6edf3XModemTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3lockdownStatus Tff7b72= Te6edf3LockdownStatusTb4b4b4(Te6edf3state Tff7b72= Te6edf3LockdownStatusTb4b4b4.Te6edf3StateTb4b4b4.Te6edf3LOCKEDTb4b4b4)
Te6edf3handleTb4b4b4(Te6edf3FromRadioTb4b4b4(Te6edf3mqttClientProxyMessage Tff7b72= Te6edf3proxyMessageTb4b4b4)Tb4b4b4)
Te6edf3handleTb4b4b4(Te6edf3FromRadioTb4b4b4(Te6edf3queueStatus Tff7b72= Te6edf3queueStatusTb4b4b4)Tb4b4b4)
Te6edf3handleTb4b4b4(Te6edf3FromRadioTb4b4b4(Te6edf3xmodemPacket Tff7b72= Te6edf3xmodemPacketTb4b4b4)Tb4b4b4)
Te6edf3handleTb4b4b4(Te6edf3FromRadioTb4b4b4(Te6edf3lockdown_status Tff7b72= Te6edf3lockdownStatusTb4b4b4)Tb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3mode Tff7b72= Te6edf3VerifyModeTb4b4b4.Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3mqttManagerTb4b4b4.Te6edf3handleMqttProxyMessageTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifyTb4b4b4(Te6edf3mode Tff7b72= Te6edf3VerifyModeTb4b4b4.Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3packetHandlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifyTb4b4b4(Te6edf3mode Tff7b72= Te6edf3VerifyModeTb4b4b4.Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3xmodemManagerTb4b4b4.Te6edf3handleIncomingXModemTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3assertEqualsTb4b4b4(Tff7b72nullTb4b4b4, Te6edf3lockdownCoordinatorTb4b4b4.Te6edf3lastStatusTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`handleFromRadio routes LOCKDOWN_STATUS to lockdownCoordinator`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3lockdownStatus Tff7b72= Te6edf3LockdownStatusTb4b4b4(Te6edf3state Tff7b72= Te6edf3LockdownStatusTb4b4b4.Te6edf3StateTb4b4b4.Te6edf3LOCKEDTb4b4b4, Te6edf3lock_reason Tff7b72= Ta5d6ff"Ta5d6fftoken_missingTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3proto Tff7b72= Te6edf3FromRadioTb4b4b4(Te6edf3lockdown_status Tff7b72= Te6edf3lockdownStatusTb4b4b4)
Te6edf3handleTb4b4b4(Te6edf3protoTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3lockdownStatusTb4b4b4, Te6edf3lockdownCoordinatorTb4b4b4.Te6edf3lastStatusTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`handleFromRadio routes QUEUESTATUS to packetHandler`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3queueStatus Tff7b72= Te6edf3QueueStatusTb4b4b4(Te6edf3free Tff7b72= T79c0ff1T79c0ff0Tb4b4b4)
Tff7b72val Te6edf3proto Tff7b72= Te6edf3FromRadioTb4b4b4(Te6edf3queueStatus Tff7b72= Te6edf3queueStatusTb4b4b4)
Te6edf3handleTb4b4b4(Te6edf3protoTb4b4b4)
Te6edf3verify Tb4b4b4{ Te6edf3packetHandlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3queueStatusTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`handleFromRadio routes CONFIG to configHandler`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3config Tff7b72= Te6edf3ConfigTb4b4b4(Te6edf3lora Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3LoRaConfigTb4b4b4(Te6edf3use_preset Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3proto Tff7b72= Te6edf3FromRadioTb4b4b4(Te6edf3config Tff7b72= Te6edf3configTb4b4b4)
Te6edf3handleTb4b4b4(Te6edf3protoTb4b4b4)
Te6edf3verify Tb4b4b4{ Te6edf3configHandlerTb4b4b4.Te6edf3handleDeviceConfigTb4b4b4(Te6edf3configTb4b4b4, Te6edf3sessionTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`handleFromRadio routes MODULE_CONFIG to configHandler`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3moduleConfig Tff7b72= Te6edf3ModuleConfigTb4b4b4(Te6edf3mqtt Tff7b72= Te6edf3ModuleConfigTb4b4b4.Te6edf3MQTTConfigTb4b4b4(Te6edf3enabled Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3proto Tff7b72= Te6edf3FromRadioTb4b4b4(Te6edf3moduleConfig Tff7b72= Te6edf3moduleConfigTb4b4b4)
Te6edf3handleTb4b4b4(Te6edf3protoTb4b4b4)
Te6edf3verify Tb4b4b4{ Te6edf3configHandlerTb4b4b4.Te6edf3handleModuleConfigTb4b4b4(Te6edf3moduleConfigTb4b4b4, Te6edf3sessionTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`handleFromRadio routes CHANNEL to configHandler`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3channel Tff7b72= Te6edf3ChannelTb4b4b4(Te6edf3index Tff7b72= T79c0ff0Tb4b4b4)
Tff7b72val Te6edf3proto Tff7b72= Te6edf3FromRadioTb4b4b4(Te6edf3channel Tff7b72= Te6edf3channelTb4b4b4)
Te6edf3handleTb4b4b4(Te6edf3protoTb4b4b4)
Te6edf3verify Tb4b4b4{ Te6edf3configHandlerTb4b4b4.Te6edf3handleChannelTb4b4b4(Te6edf3channelTb4b4b4, Te6edf3sessionTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`handleFromRadio routes REGION_PRESETS to configHandler`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3map Tff7b72= Te6edf3LoRaRegionPresetMapTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3proto Tff7b72= Te6edf3FromRadioTb4b4b4(Te6edf3region_presets Tff7b72= Te6edf3mapTb4b4b4)
Te6edf3handleTb4b4b4(Te6edf3protoTb4b4b4)
Te6edf3verify Tb4b4b4{ Te6edf3configHandlerTb4b4b4.Te6edf3handleRegionPresetsTb4b4b4(Te6edf3mapTb4b4b4, Te6edf3sessionTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`handleFromRadio routes MQTT_CLIENT_PROXY_MESSAGE to mqttManager`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3proxyMsg Tff7b72= Te6edf3MqttClientProxyMessageTb4b4b4(Te6edf3topic Tff7b72= Ta5d6ff"Ta5d6fftest/topicTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3proto Tff7b72= Te6edf3FromRadioTb4b4b4(Te6edf3mqttClientProxyMessage Tff7b72= Te6edf3proxyMsgTb4b4b4)
Te6edf3handleTb4b4b4(Te6edf3protoTb4b4b4)
Te6edf3verify Tb4b4b4{ Te6edf3mqttManagerTb4b4b4.Te6edf3handleMqttProxyMessageTb4b4b4(Te6edf3proxyMsgTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`handleFromRadio routes CLIENTNOTIFICATION to serviceRepository`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3notification Tff7b72= Te6edf3ClientNotificationTb4b4b4(Te6edf3message Tff7b72= Ta5d6ff"Ta5d6fftestTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3proto Tff7b72= Te6edf3FromRadioTb4b4b4(Te6edf3clientNotification Tff7b72= Te6edf3notificationTb4b4b4)
T8b949e// Note: getString() from Compose Resources requires Skiko native lib which
T8b949e// is not available in headless JVM tests. We test the parts that don't trigger it.
Tff7b72try Tb4b4b4{
Te6edf3handleTb4b4b4(Te6edf3protoTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3_Tb4b4b4: Te6edf3ThrowableTb4b4b4) Tb4b4b4{
T8b949e// Expected: Skiko can't load in headless JVM/native
Tb4b4b4}
Te6edf3verify Tb4b4b4{ Te6edf3serviceRepositoryTb4b4b4.Te6edf3setClientNotificationTb4b4b4(Te6edf3notificationTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`stale client notification is discarded before publication`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3notification Tff7b72= Te6edf3ClientNotificationTb4b4b4(Te6edf3message Tff7b72= Ta5d6ff"Ta5d6ffstaleTa5d6ff"Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3runIfSessionActiveTb4b4b4(Te6edf3sessionTb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72false
Te6edf3handleTb4b4b4(Te6edf3FromRadioTb4b4b4(Te6edf3clientNotification Tff7b72= Te6edf3notificationTb4b4b4)Tb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3mode Tff7b72= Te6edf3VerifyModeTb4b4b4.Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3serviceRepositoryTb4b4b4.Te6edf3setClientNotificationTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3mode Tff7b72= Te6edf3VerifyModeTb4b4b4.Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3notificationManagerTb4b4b4.Te6edf3dispatchTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`client alert is skipped when the session retires after publication`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3notification Tff7b72= Te6edf3ClientNotificationTb4b4b4(Te6edf3message Tff7b72= Ta5d6ff"Ta5d6ffretiredTa5d6ff"Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3runWithSessionLeaseTb4b4b4(Te6edf3sessionTb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72false
Te6edf3handleTb4b4b4(Te6edf3FromRadioTb4b4b4(Te6edf3clientNotification Tff7b72= Te6edf3notificationTb4b4b4)Tb4b4b4)
Te6edf3verify Tb4b4b4{ Te6edf3serviceRepositoryTb4b4b4.Te6edf3setClientNotificationTb4b4b4(Te6edf3notificationTb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3mode Tff7b72= Te6edf3VerifyModeTb4b4b4.Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3notificationManagerTb4b4b4.Te6edf3dispatchTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`OTA status client notifications are identified`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3assertTrueTb4b4b4(Te6edf3ClientNotificationTb4b4b4(Te6edf3message Tff7b72= Ta5d6ff"Ta5d6ffRebooting to WiFi OTATa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3isOtaStatusNotificationTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3ClientNotificationTb4b4b4(Te6edf3message Tff7b72= Ta5d6ff"Ta5d6ffOTA Loader does not support WiFiTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3isOtaStatusNotificationTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertTrueTb4b4b4(
Te6edf3ClientNotificationTb4b4b4(Te6edf3message Tff7b72= Ta5d6ff"Ta5d6ffCannot start OTA: OTA Loader partition not found.Ta5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3isOtaStatusNotificationTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3ClientNotificationTb4b4b4(Te6edf3message Tff7b72= Ta5d6ff"Ta5d6ffUnable to switch to the OTA partition.Ta5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3isOtaStatusNotificationTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`non OTA client notifications are not identified as OTA status`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3assertFalseTb4b4b4(Te6edf3ClientNotificationTb4b4b4(Te6edf3message Tff7b72= Ta5d6ff"Ta5d6fftestTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3isOtaStatusNotificationTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3ClientNotificationTb4b4b4(Te6edf3message Tff7b72= Ta5d6ff"Ta5d6ffLow batteryTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3isOtaStatusNotificationTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3ClientNotificationTb4b4b4(Te6edf3message Tff7b72= Ta5d6ff"Ta5d6ffROTATE credentialsTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3isOtaStatusNotificationTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3ClientNotificationTb4b4b4(Te6edf3message Tff7b72= Ta5d6ff"Ta5d6ffQuota exceededTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3isOtaStatusNotificationTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.12s